#include <stdio.h>

// 最难想的一集
// 如果想交换所有奇偶位的二进制位,可以用函数实现
// 但是题目要求需要用宏实现,就非常难受了

// 如果用宏的话,就需要用到位操作符了
// 通过思考,我们可以把交换这个分成三个步骤来进行
// 1.将一个变量上面的所有二进制位分为奇数位和偶数位,然后分开
// 2.将奇数位全体向左移一位,偶数位向右移一位(奇变偶,偶变奇)
// 3.将分开的二进制位和到一起

// 以下是所有位操作符的功能
// ^: 按位异或,相同则0,相反则1
// &: 按位与,有0则0,两1则1
// |: 按位或,有1则1,两0则0
// ~: 对位取反

#define SwapIntBit (n) (((n) & 0x55555555) << 1 | ((n) & 0xaaaaaaaa) >> 1) 

// 用16进制来分别表示只有奇位和只有偶位有数的二进制数,再将所取数字分别与(有0则0,两1则1)得到该数字的所有奇偶位
// 接着,奇位左移,偶位右移
// 再按位或(有1则1,两0则0),合起来就可以得到相求数字

int main ()
{

    int n = 10 ;

    SwapIntBit (n) ;

    printf ("%d" , n) ;
    
    return 0 ;

}